# """
# @author: lyf
# @file: 2023-2-9练习.py
# @time: 2023/2/9 21:18
# """
# 1.
# Python解释器：
# cpython 用c语言写的 官方，支持很多库
# ipython 交互式解释器
# pypy 用Python写的Python执行速度快，但是很多库不支持
#
# 2.
# Python2和3的区别：
# 1.整数：python2中区分整型（int）和长整型（long新式类，继承object的类都称为新式类），python3不区分；
# 2.python2中没有f 标志位格式化，python3才有；
# 3.python3里面，True和False都是关键字，python2里面不是。
# 4.python2中的整数相除属于地板除，要想真除就得变成浮点数python3中的整数相除就是真除
# 5.python2的编码是ascii码，python3的默认编码是utf-8
# 6.在python包结构目录里    python2 ：_init_.py是必须的
# python3：_init_.py 是可选的
# 7.python2里面只有继承了object的类才是新式类，其他的是经典类
# python3里面默认所有类都是继承的object，所以python3都是新式类
#
# 3.Python里list是列表，set是集合
# 列表有序而集合无序
# 列表可以有重复元素，集合不可以
#
# 4.装饰器：是一种设计模式，主要用于给函数或者类添加一些额外功能
# 装饰器的本质是闭包函数，它需要一个callable（函数、类）对象作为参数传递过去
# 写过linux关于ping命令的装饰器
# 三层装饰器就是给双层装饰器加参数
#
# 5.Python 的list底层由结构体实现
# 扩容是指解释器在添加元素时发现容量不够的时候才会扩容，将会重新申请内存
# 字典底层通过哈希表（散列表）实现，是一种关联数组，数组的索引通过哈希函数处理得到散列值将数组关联起来。所以底层是无序的。
#
# 6.生成器内部的代码执行到yield会返回，返回的内容为yield后的表达式。
# 迭代器可以看作是一个特殊的对象，每次调用该对象时会返回自身的下一个元素
# 由于可以使用生成器很方便地实现一个迭代器，因此迭代器适用的场景生成器几乎都适用
#
# 7.异常捕获用在代码不确定是否能执行的地方，可以判断错误，使用的语句为try，expect
# 常见的异常有：AssertionError 断言语句失败
# 			IndentationError 代码没有正确对齐,主要是缩进错误
#
# 8.Python的变量名解析机制称为：LEGB法则。L：本地作用域；E：上一层结构中def或lambda的本地作用域；G：全局作用域；B：内置作用域
#
# 9.查找顺序：
# 1、先从内存中找
# 2、再从内置模块中找
# 3、最后从sys.path中找（环境变量）一定要分清楚谁是执行文件谁是被导入文件
#
# 绝对导入是通过绝对路径导入，路径更加清晰
# 相对导入是通过相对路径导入，不能知道完整的路径
#
# 10.__name__ 变量的值就是:__main__
# 可以通过 __name__ 来隐藏不需要执行的代码，并使它们不被执行
# __file__是模块(模块对象)的属性，共享库文件的路径名
#
# 11.在Python中，所有以__开头和结尾的方法，统称为魔术方法（magic method）
# 使用过__init__,__new__，__str__
#
# 12.Python3使用的新式类，继承object的类都称为新式类
# 新式类使用：C3算法
# 首先将自身加入到本序列，然后对继承序列的元素依次判断
# 若某元素不在其他序列或者他是所有继承序列的第一个，那么就把这个元素提取到本序列
#
# 13.打包过，有
# 1、生成 spec 文件
# 2、运行 rpmlint
# 3、下载源码
# 4、构建源软件包
#
# 14.引用re模块使用正则，^$表示空行，r^#表示以#开头的行
# s1 = "hello world"
# s2 = "test123 sc"
# list = []
# for i in s1:
#     if i.isalpha():
#         list.append(i)
# list.append(s2)
# print(list)
#
# 15.class Queue():
#     def __init__(self, array = None):
#         self.array = array
#
#     def length(self):
#         if not self.array:
#             return 0
#         else:
#             return len(self.array)
#
#     def is_Empty(self):
#         return self.array == None
#
#     def push(self, value):
#         self.array.append(value)
#
#     def pop(self):
#         self.array.pop(0)
#
#     def top(self):
#         return self.array[0]
#
#     def travel(self):
#         print(self.array)
#
# 16.
# import os
# # dir参数是文件路径
# def tree_ord(dir, depth):
#     # 如果是母文件，则不用缩进和连接符直接输出
#     if depth == 0:
#         print(dir)
#     for element in os.listdir(dir):
#         # 输出子文件夹
#         print(" |     " * depth, "|----" + element)
#         # 更新到子文件夹的路径
#         path = dir + "//" + element
#         # 判断子文件夹是否为文件夹
#         if (os.path.isdir(path)):
#             # 如果是文件夹则递归输出,深度+1
#             tree_ord(path, depth + 1)
# tree_ord("D:\BaiduNetdisk",0)
#
# 17.
# import requests
# result = requests.get("https://n.sinaimg.cn/eladies/crawl/513/w550h763/20230207/dccb-24eecb5df5adf448ce01c40b99c6c0de.jpg")
# print(dir(result))
# print(result.content)
# with open("picture.jpg","wb") as fp:
#     fp.write(result.content)
#
# 18.python的内存管理，深浅拷贝的区别
# 内存管理：以引用计数为主,分代回收和标记清除为辅的回收方式
#
# 只有容器里包可变数类型的时候深浅拷贝才会造成不同的影响:
# copy()浅拷贝只是拷贝地址,容器所储存的地址还是同一个,只是容器自身的地址不一样
# 深拷贝会拷贝每一层的值,新创建一个存储地址
#
# 19.删除文件  文件名.truncate()
# 创建文件  变量名= open("文件名","w+")
# 写入文件  文件名.write()（r状态下只读不写入）
# 读取文件  文件名.read()  文件名.readlines()
#
# 20.assert关键字使您可以测试代码中的条件是否返回True，否则程序将引发AssertionError。可以编写一条代码返回False时输出的消息。